package com.xucy.springboot.concurrent.tools;

import java.util.concurrent.CountDownLatch;

/**
 * @Author xucy
 * @Date 2019-07-20 14:54
 * @Description 　CountDownLatch类位于java.util.concurrent包下，利用它可以实现类似计数器的功能。
 * 比如有一个任务A，它要等待其他4个任务执行完毕之后才能执行，此时就可以利用CountDownLatch来实现这种功能了。
 *  通俗一点的说 就是 使用CountDownLatch 时  几个线程使用同一个CountDownLatch对象 有一个线程调用await方法
 *      其他线程使用countDown()方法，当最后计数器减到0的时候，await调用处 继续往下执行；
 **/

public class CountDownLatchTest {

    private static CountDownLatch countDownLatch=new CountDownLatch(2);

    public static void main(String[] args) {

        System.out.println("主线程开始执行");

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程1开始执行");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                countDownLatch.countDown();
                System.out.println("线程1结束执行");
            }
        }){
        }.start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程2开始执行");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                countDownLatch.countDown();
                System.out.println("线程2结束执行");
            }
        }){
        }.start();

        System.out.println("主线程等待countDown的值到0");
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("两个线程执行完毕");

    }
}
